import json

from django.http import JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View

from auser.models import BookInfo

from drf_book.serializer import BookSerializer
class BooksView(View):
    """
        获取所有图书和保存图书
    """

    def get(self, request):
        """
            获取所有图书
            路由：GET /books/
        :param request:
        :return:
        """
        books = BookInfo.objects.all()
        # 初始化生成序列化器对象,获取多个数据对象使用参数many=True
        ser = BookSerializer(books,many=True)
        # 使用序列化器对象的data方法获取序列化后的结果
        # @property把一个类中的方法当成属性使用
        data = ser.data
        # 3、返回所有对象字段内容
        return JsonResponse({'book_list':data})

    def post(self, request):
        """
            保存图书,前端给后端传送数据
            反序列化的过程：（保存和更新会用到）
                对于接收到的前端数据进行验证，后保存或更新到数据库，
                生成一个新的数据对象。
        :param request:
        :return:
        """
        # 1、获取保存的图书数据
        data = request.body.decode()
        data_dict = json.loads(data)
        # 2、验证图书数据字段

        # data接收需要验证的数据
        ser=BookSerializer(data=data_dict)
        # 序列化器的验证方法
        ser.is_valid()

        ser.is_valid(raise_exception=True) # raise_exception=True验证失败直接返回
        # 验证成功后，获取验证后的数据
        # print(ser.validated_data)

        # 3、保存图书
        # book = BookInfo.objects.create(btitle=ser.validated_data['btitle'], bpub_date=ser.validated_data['bpub_date'])
        #  # 4、返回保存后的图书数据
        # ser = BookSerializer(book)
        # 调用序列器中封装保存方法create
        ser.save()

        return JsonResponse(ser.data)


class BookView(View):
    """
        获取单一图书数据
        更新图书
        删除图书
    """

    def get(self, request, pk):
        """
        获取单一图书数据
        :param request:
        :param pk:
        :return:
        """
        # 1、根据pk值查询图书对象
        try:
            book=BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '错误的id值'})
        # 2、返回图书数据
        ser = BookSerializer(book)
        return JsonResponse(ser.data)


    def put(self, request, pk):
        """
         更新图书，逻辑与保存相同
        :param request:
        :param pk:
        :return:
        """
        # 1、获取保存的图书数据
        data = request.body.decode()
        data_dict = json.loads(data)

        # 2、验证图书数据字段
        # 根据pk值查询要更新的图书对象,
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '错误的id值'})
        # 获取对象后，调用序列化器,进行初始化操作,
        # 传递两个对象book,data给instance，data
        # def __init__(self, instance=None, data=empty, **kwargs):
        ser = BookSerializer(book,data=data_dict)
        # 序列化器的验证方法
        # ser.is_valid()
        ser.is_valid(raise_exception=True)  # raise_exception=True验证失败直接返回

        # num = BookInfo.objects.filter(id=pk).update(**data_dict)
        # 4、返回更新后的图书数据
        # book = BookInfo.objects.get(id=pk)
        # 调用序列化器中封装的保存方法update
        # save方法有两个方法，create和update，根据instance判断用哪个方法
        ser.save()
        return JsonResponse(ser.data)


    def delete(self, request, pk):
        """
        删除图书
        :param request:
        :param pk:
        :return:
        """
        # 1.查询要删除的对象
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error':'错误id值'})
        # 2.逻辑删除
        book.is_delete=True
        book.save()
        # 物理删除
        # book.delete()
        # 3.返回结果
        return JsonResponse({})

